/*
 * @Description: 请描述此文件
 * @Author: LDM
 * @Date: 2021-07-27 19:45:22
 * @LastEditors: LDM
 * @LastEditTime: 2021-08-17 16:17:05
 */
/* @flow */

import { toArray } from '../util/index'

// 初始化Use函数
export function initUse (Vue: GlobalAPI) {
  // 传进来Vue对象，并注册一个 use函数
  Vue.use = function (plugin: Function | Object) {
    // plugin为调用 Vue.use()时，传进来的插件，可为  函数或对象

    // 取出之前安装过的插件数组，（如果没有则 初始化 = []）
    const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
    // 查看是否注册过，防止重复注册
    if (installedPlugins.indexOf(plugin) > -1) {
      // 已经有了，直接返回 Vue
      return this
    }

    
    // additional parameters
    // 根据索引1开始到最后，从arguments拿到剩余参转成数组， [参数二，参数三]
    const args = toArray(arguments, 1) 
    //在前面添加一个 this，也就是 Vue，
    args.unshift(this)
    // 兼容可传function | object
    // 如果是对象，看看该对象是否有install方法
    if (typeof plugin.install === 'function') {
      // 有install，执行该install，并传args的参数
      plugin.install.apply(plugin, args)
    } else if (typeof plugin === 'function') { 
      //如果是函数，直接执行即可
      plugin.apply(null, args)
    }
    // 注册过了，就添加一下，下次可以用于防止重复注册
    installedPlugins.push(plugin)
    return this
  }
}
